﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entidades.Eventos;
using Datos.Eventos;

namespace Negocio.Eventos
{
    public static class EveEventoBLL
    {
       
         public static List<EveReserva> listar(this EveFiltroReserva eveFiltroEvento)
         {
               Entities context = new Entities(ConnectionString.CONECTION_STRING);
               return EveReservaDAL.listar(context, eveFiltroEvento);
         }

         public static List<EveReserva> listarReserva(this EveFiltroReserva eveFiltroEvento)
         {
             Entities context = new Entities(ConnectionString.CONECTION_STRING);
             return EveReservaDAL.listarReserva(context, eveFiltroEvento);
         }

           public static List<EveEvento> buscarPorTipoNombre(int idTipoevento, String nombreEvento)
           {

               Entities context = new Entities(ConnectionString.CONECTION_STRING);
               return EveEventoDAL.buscar(context, idTipoevento, nombreEvento);
           }

           public static EveEvento buscar(int idEvento)
           {

               Entities context = new Entities(ConnectionString.CONECTION_STRING);
               return EveEventoDAL.buscar(context, idEvento);
           }

           public static List<EveEvento> listarEventos(this EveFiltroEvento eveFiltroEvento)
           {
               Entities context = new Entities(ConnectionString.CONECTION_STRING);
               return EveEventoDAL.listar(context, eveFiltroEvento);
           }

            public static void guardar(this EveEvento eveEvento)
            {

                Entities context = new Entities(ConnectionString.CONECTION_STRING);
                context.Connection.Open();

                using (System.Data.Common.DbTransaction transaction = context.Connection.BeginTransaction())
                {

                    try
                    {
                        
                        List<EveProductoEvento> eveProductoEventoList = eveEvento.Eve_Producto_evento.ToList();
                        eveEvento.Eve_Producto_evento = null;
                        EveEventoDAL.guardar(context, eveEvento);

                        foreach (EveProductoEvento eveProductoEvento in eveProductoEventoList)
                        {
                            eveProductoEvento.Eve_Evento = eveEvento;
                            EveProductoEventoDAL.guardar(context, eveProductoEvento);
                        }
                        context.AcceptAllChanges();
                        transaction.Commit();
                    }
                    catch (Exception ex)
                    {
                        transaction.Rollback();
                    }
                }

                context.Connection.Close();

                context.SaveChanges();
            }

            public static void modificar(this EveEvento eveEventoModificado)
            {

                Entities context = new Entities(ConnectionString.CONECTION_STRING);
                context.Connection.Open();

                using (System.Data.Common.DbTransaction transaction = context.Connection.BeginTransaction())
                {

                    try
                    {
                        //buscamos el evento 
                        EveEvento eveEventoPorModificar = EveEventoDAL.buscar(context, eveEventoModificado.idEvento);
                        eveEventoPorModificar.actualizarPropiedades(eveEventoModificado);
                        context.SaveChanges();
                        context.AcceptAllChanges();
                        transaction.Commit();
                    }
                    catch (Exception ex)
                    {
                        transaction.Rollback();
                    }
                }

                context.Connection.Close();
                context.SaveChanges();
            }


            private static void actualizarPropiedades(this EveEvento eveEventoPorModificar, EveEvento eveEventoModificada)
            {
                eveEventoPorModificar.estado = eveEventoModificada.estado;
                eveEventoPorModificar.nombre = eveEventoModificada.nombre;
                eveEventoPorModificar.observacion = eveEventoModificada.observacion;
                eveEventoPorModificar.idTipoEvento = eveEventoModificada.idTipoEvento;
                eveEventoPorModificar.duracion = eveEventoModificada.duracion;

                foreach(EveProductoEvento eveProductoEvento in eveEventoPorModificar.Eve_Producto_evento)
                {
                    eveProductoEvento.descuento = eveEventoModificada.Eve_Producto_evento.Where(e => e.idProducto == eveProductoEvento.idProducto).FirstOrDefault().descuento;
                }
            }

            public static void eliminar(int idEvento)
            {  
                
                Entities context = new Entities(ConnectionString.CONECTION_STRING);
                context.Connection.Open();

                using (System.Data.Common.DbTransaction transaction = context.Connection.BeginTransaction())
                {
                    try
                    {
                        EveEvento eveEvento = EveEventoDAL.buscar(context,idEvento);
                        List<EveProductoEvento> eveProductoEventoList = eveEvento.Eve_Producto_evento.ToList();
                        foreach (EveProductoEvento eveProductoEvento in eveProductoEventoList)
                        {
                            EveProductoEventoDAL.eliminar(context,eveProductoEvento);
                        }


                        EveEventoDAL.eliminar(context,eveEvento);
                        context.AcceptAllChanges();
                        transaction.Commit();
                    }
                    catch (Exception ex)
                    {
                        transaction.Rollback();
                    }
                }

                context.Connection.Close();
                context.SaveChanges();
            }


    }
}
